<?php

class Application_Model_Usuario
{
  protected $_email;
  protected $_senhaSalgada;
  protected $_sal;
  protected $_nome;
  protected $_bolitos;
  protected $_ativo;
  protected $_administrador;

  public function __construct($email, $senhaSalgada, $sal, $nome, $bolitos, $ativo, $administrador)
  {
    $this->_email = $email;
    $this->_senhaSalgada = $senhaSalgada;
    $this->_sal = $sal;
    $this->_nome = $nome;
    $this->_bolitos = $bolitos;
    $this->_ativo = $ativo;
    $this->_administrador = $administrador;
  }

  public function getEmail()
  {
    return $this->_email;
  }

  public function setEmail($email)
  {
    $this->_email = $email;
    return $this;
  }

  public function getSenhaSalgada()
  {
    return $this->_senhaSalgada;
  }

  public function setSenhaSalgada($senhaSalgada)
  {
    $this->_senhaSalgada = $senhaSalgada;
    return $this;
  }

  public function getSal()
  {
    return $this->_sal;
  }

  public function setSal($sal)
  {
    $this->_sal = $sal;
    return $this;
  }

  public function getNome()
  {
    return $this->_nome;
  }

  public function setNome($nome)
  {
    $this->_nome = $nome;
    return $this;
  }

  public function getBolitos()
  {
    return $this->_bolitos;
  }

  public function setBolitos($bolitos)
  {
    $this->_bolitos = $bolitos;
    return $this;
  }

  public function getBolitosString()
  {
    return sprintf('%0.2f', $this->_bolitos/100.0 );
  }

  public function getAtivo()
  {
    return $this->_ativo;
  }

  public function setAtivo($administrador)
  {
    $this->_ativo = $administrador;
    return $this;
  }

  public function getAdministrador()
  {
    return $this->_administrador;
  }

  public function setAdministrador($administrador)
  {
    $this->_administrador = $administrador;
    return $this;
  }

  /**
   *
   * Esta funcao e' encarregada de gerar uma senha para o usuario, um token
   * de confirmacao. Enviar um e-mail contendo essas informacoes para o
   * usuario e persistir tudo.
   *
   * @param <type> $nome
   * @param <type> $email
   */
  public static function requisitarCadastro ($nome, $email)
  {
    $senha = rand(100000,999999);
    $sal = time();
    $senhaSalgada = md5($senha . $sal);
    $cadastro = new Application_Model_Usuario($email, $senhaSalgada, $sal, $nome, 10000, 0, 0);
    
    $persistencia = new Application_Model_UsuarioMapper();
    $persistencia->insert($cadastro);


    $texto = 'Voce recebeu este e-mail porque solicitou um cadastro '
            .'no BOLADONA.COM. Seguem suas informacoes pessoais'."\n\n\n\n"
            .'Seu nome: '.$nome."\n"
            .'e-mail: '.$email."\n"
            .'Sua senha: '.$senha."\n\n"
            .'Clique neste link para confirmar seu cadastro:'."\n"
            .'http://'.$_SERVER['SERVER_NAME'].'/usuario/confirmar?token='
            .$senhaSalgada;

    $mail = new Zend_Mail();
    $mail->setBodyText($texto);
    $mail->setFrom('noreply', 'Boladona mail');
    $mail->addTo($email, $nome);
    $mail->setSubject('Seu cadastro no BOLADONA.COM');

    $sucesso = 0;

    try {
      $sucesso = $mail->send();
    } catch (Exception $ex) {
      echo '<pre>'.$ex.'</pre>';
    }

    return array('email' => $texto, 'sucesso' => $sucesso);
  }

  /**
   * Confirma o cadastro correspondente ao token em questao.
   *
   * @param <type> $tokenConfirmacao
   */
  public static function confirmarCadastro ($tokenConfirmacao)
  {
    $persistencia = new Application_Model_UsuarioMapper();
    $usuario = new Application_Model_Usuario(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    $resultado = $persistencia->findBySenhaSalgada($tokenConfirmacao, $usuario);

    if($resultado === NULL) {
        return false;
    }

    $usuario->setAtivo(true);
  
    return $persistencia->save($usuario);
  }

  public static function verificaSenha($senha, $sal, $senhaSalgada){
      $pre = md5($senha . $sal);
      if($pre == $senhaSalgada) return true;
      else return false;
  }

  public function calculaSenha($senha){
      $senhaSalgada = md5($senha . $this->getSal());
      $this->setSenhaSalgada($senhaSalgada);
  }

  /**
   * Funcao baseada na requisitar cadastro. Basicamente, a unica alteracao é
   * mensagem enviada ao usuario, que neste caso nao fez um cadastro, foi convidado
   * por alguem.
   * Esta funcao e' encarregada de gerar uma senha para o usuario, um token
   * de confirmacao. Enviar um e-mail contendo essas informacoes para o
   * usuario e persistir tudo.
   *
   * @param <type> $nome
   * @param <type> $email
   */
  public static function requisitarCadastroDeConvite ($emailConvidado, $nomeCriadorBolao, $nomeBolao)
  {
    $senha = rand(100000,999999);
    $sal = time();
    $senhaSalgada = md5($senha . $sal);
    //o nome desse usuario eh o seu email:
    $cadastro = new Application_Model_Usuario($emailConvidado, $senhaSalgada, $sal,
                                              $emailConvidado, 10000, 0, 0);

    $persistencia = new Application_Model_UsuarioMapper();
    $persistencia->insert($cadastro);


    $texto = 'Voce recebeu este e-mail porque '.$nomeCriadorBolao.'convidou-lhe'
            .'para participar de um bolao no BOLADONA.COM.'
            .'Ja criamos um cadastro para voce.'
            .'Seguem suas informacoes pessoais'."\n\n\n\n"
            .'Seu nome: '.$emailConvidado."\n"
            .'e-mail: '.$emailConvidado."\n"
            .'Sua senha: '.$senha."\n\n"
            .'Clique neste link para confirmar seu cadastro:'."\n"
            .'http://'.$_SERVER['SERVER_NAME'].'/usuario/confirmar?token='
            .$senhaSalgada
            ."\n"
            .'Desejamos boa sorte em suas apostas!';

    $mail = new Zend_Mail();
    $mail->setBodyText($texto);
    $mail->setFrom('noreply', 'Boladona mail');
    $mail->addTo($emailConvidado, $emailConvidado);
    $mail->setSubject('Convite para bolao no BOLADONA.COM');

    $sucesso = 0;

    try {
      $sucesso = $mail->send();
    } catch (Exception $ex) {
      echo '<pre>'.$ex.'</pre>';
    }
    return array('email' => $texto, 'sucesso' => $sucesso);
  }

}
